<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\service\RateLimiterService;
use app\service\SeckillService;
use think\Cache;
use think\Db;
use think\Request;

class Goods extends Api
{
    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';


    // 商品秒杀
    public function seckill(Request $request)
    {
//        Cache::clear();
//        die();
        // 创建限流器实例
        $rateLimiter = new RateLimiterService();

        // 获取客户端IP
        $ip = $request->ip();

        // 方式1：使用令牌桶算法限流
        // 每个IP每秒最多100个请求
        // 第一级：IP级别限流（宽松）
        if (!$rateLimiter::allow($ip, 100, 100)) {
            return json(['success' => false, 'msg' => '请求过于频繁']);
        }

        // 方式2：使用滑动窗口限流
        // 每个IP每5秒最多50个请求
        // 第二级：用户级别限流（严格）
        // if (!$rateLimiter::slidingWindow($ip, 5, 50)) {
        //     return json(['success' => false, 'msg' => '请求过于频繁']);
        // }

        // 方式3：使用固定窗口限流
        // 每个IP每秒最多100个请求
        // 第三级：全局业务限流
        // if (!$rateLimiter::fixedWindow($ip, 1, 100)) {
        //     return json(['success' => false, 'msg' => '请求过于频繁']);
        // }

        $goodsId = $request->post('goods_id/d',0);
        if(!$goodsId){
            $this->error('商品id不能为空');
        }
        $userId = 1;
        $goods = Db::name('goods')->where('id',$goodsId)->find();
        SeckillService::initStock($goodsId, $goods['seckill_stock']);
        try {
            // 调用秒杀服务
            $result = SeckillService::doSeckill($userId,$goodsId);
            return json($result);
        } catch (\Exception $e) {
            return json(['success' => false, 'msg' => $e->getMessage()]);
        }
    }

    // 初始化库存（管理接口）
    public function initStock(Request $request)
    {
        $goodsId = $request->param('goods_id/d', 0);
        $stock = $request->param('stock/d', 0);

        if (!$goodsId || $stock <= 0) {
            return json(['success' => false, 'msg' => '参数错误']);
        }

        SeckillService::initStock($goodsId, $stock);
        return json(['success' => true, 'msg' => '库存初始化成功']);
    }
}